#include "structure_index.hpp"

void created_chained_ligne(chained_ligne & c_l)
{
  c_l=NULL;
}

void created_chained_index(chained_index & c_i)
{
  c_i=NULL;
}

void add_word_index(chained_index & c_i,const string & word)
{
  // Si c_i est NULL alors on rajoute un maillon
  // sinon il y a plusieurs cas
  if(c_i == NULL)
    {
      // Creation du maillon
      c_i=new list_index;

      c_i->word=word;
      created_chained_ligne(c_i->ligne);
      c_i->next=NULL;
    }
  else
    {
      bool word_exist(false);
      list_index * lecture=c_i;

      // Boucle de lecture
      // Si le suivant de c_i != NULL ET que le bool est a faux
      // Alors on a pas trouver le mot
      // Cette etape permet de ne pas remettre plusieurs fois le meme mot
      while(lecture->next != NULL && !word_exist)
	{
	  if(lecture->word == word)
	    word_exist=true;
	  else
	    lecture=lecture->next;
	}

      // Sortie de la boucle a cause de lecture->next
      // Du coup on verifie si le mot est present
      if(lecture->word == word)
	word_exist=true;

      // Si le mot nexiste pas alors on le met a la suite de la chaine
      if(!word_exist)
	{
	  chained_index tmp=new list_index;
	  tmp->word=word;
	  created_chained_ligne(tmp->ligne);
	  tmp->next=NULL;

	  lecture->next=tmp;
	}
    }
}

void add_number_ligne(chained_index & c_l,const string & word,const int & number)
{
  list_index * lecture=c_l;
  bool find_word=false;

  // Recherche du mot
  while(lecture!=NULL && !find_word)
    {
      if(!find_word)
	{
	  if(word == lecture->word)
	    find_word=true;
	  else
	    lecture=lecture->next;
	}
    }

  // Si le mot est trouve alors on rajoute le maillon de la ligne
  if(find_word)
    {
      // Si la structure est vide alors on rajoute un maillon
      // Sinon on va cherche la fin de la structure pour rajouter le maillon
      if(lecture->ligne == NULL)
	{
	  // Creation du maillon
	  list_ligne * tmp=new list_ligne;

	  tmp->ligne=number;
	  tmp->next=NULL;
	  // Rajout du maillon au debut
	  lecture->ligne = tmp;
	}
      else
	{
	  list_ligne * lecture_ligne=lecture->ligne;
	  bool same_line=false;
	  // Creation du maillon
	  list_ligne * tmp=new list_ligne;

	  tmp->ligne=number;
	  tmp->next=NULL;

	  // Si le la ligne est deja mise alors on ne la rajoute pas
	  if(lecture_ligne->ligne == number)
	    same_line=true;

	  // Boucle de lecture
	  while(lecture_ligne->next!=NULL && !same_line)
	    {
	      if(lecture_ligne->ligne!=number)
		lecture_ligne=lecture_ligne->next;
	      else
		same_line=true;
	    }

	  // Si ce nest pas la meme ligne alors on la rajoute
	  // Sinon on supprime lallocation
	  if(!same_line)
	    lecture_ligne->next=tmp;
	  else
	    delete tmp;
	}
    }
}

void delete_ligne(chained_ligne & c_l)
{
  if(c_l != NULL)
    {
      list_ligne * tmp=c_l;
      c_l=c_l->next;
      delete tmp;
    }
}

void delete_all_ligne(chained_ligne & c_l)
{
  while(c_l != NULL)
    delete_ligne(c_l);
}

void delete_index(chained_index & c_i)
{
  if(c_i != NULL)
    {
      list_index * tmp=c_i;
      c_i=c_i->next;
      delete_all_ligne(tmp->ligne);
      delete tmp;
    }
}

void delete_all_index(chained_index & c_i)
{
  while(c_i != NULL)
    delete_index(c_i);
}

void affiche_ligne(const chained_ligne & c_l)
{
  chained_ligne lecture=c_l;
  cout << "Ligne : ";

  if(lecture != NULL)
    {
      while(lecture != NULL)
	{
	  cout << lecture->ligne << " ";
	  lecture=lecture->next;
	}
      cout << endl;
    }
  else
    cout << "NULL" << endl;
}

void affiche_index(const chained_index & c_i)
{
  chained_index lecture=c_i;

  while(lecture != NULL)
    {
      cout << "Mot : " << lecture->word << endl;
      affiche_ligne(lecture->ligne);
      lecture=lecture->next;
    }

}
